iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0

在介紹 slot 之前,我們需要先了解元件的編譯作用域:

元件的編譯作用域

多數程式語言都會有變數作用範圍的概念,而我們就可以將編譯作用域想像成「元件的 scope」。例如當外層元件與內層元件的 data 都有相同名稱的屬性時:

const app = Vue.createApp({
  data() {
    return {
      msg: 'Parent !'
    }
  }
});

app.component('custom-component', {
  template: `<div>Hello!</div>`,
  data () {
    return {
      msg: 'Child!'
    }
  }
});

由以上程式碼可以看到,內外元件都各自擁有 msg 這個 data 屬性,但內外層的 msg 實際上是兩種不同的屬性。

假如將模板內容更改一下:

<div id="app">
  <h1>{{ msg }}</h1>
  <custom-component>
    {{ msg }}
  </custom-component>
</div>

這樣就會讓外層的 <h1></h1> 會出現父層的 Parent !

而在子層內的 <custom-component> 內的 {{ msg }} 則會被 <custom-component> 原本所定義的 template 模板內容所取代:

<div id="app">
  <h1>{{ msg }}</h1>

 <custom-component>
    {{ msg }}
 </custom-component>
</div>

這是由於 Vue.js 在編譯元件的模板 (template) 時,會以元件模板的所定義內容為主。 也就是說,即使在 <custom-component> 內放入任何內容, Vue.js 在元件編譯成網頁模板的時候,會自動無視裡面的東西,並且以子元件的模板來替換掉。

Slot

slot 在官方文件的名稱叫做「插槽」,其作用是由外層元件將內容置放在至子層元件指定的位置中,來看看範例:

app.component('custom-component', {
  template: `<div> 
    Hello!
    <div>
      <slot></slot>
    </div>
  </div>`,
  data () {
    return {
      msg: 'Child !'
    }
  }
});

我們可以在 customComponent 加上一個 slot 標籤:

<custom-component>
  {{ msg }}
</custom-component>

來看看網頁的表現:

原本應該定義在父層元件的 Parent,就會出現在子層元件的 slot 標籤位置,這是因為 slot 的特性是保留一個空間可以從外部傳入內容,但子元件本身不會有控制權。

那我們今天對於 Vue Slot 插槽的介紹就到這裡結束了
我們明天見囉!謝謝各位
/images/emoticon/emoticon34.gif


上一篇
[Vue] Day26 props 資料類型的驗證
下一篇
[Vue] Day28 SFC 單一元件檔
系列文
不用去柬埔寨也能活摘 Vue30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言